/* Universidade Federal de Campina Grande - UFCG
 * Centro de Engenharia El�trica e Inform�tica - CEEI
 * Departamento de Sistemas e Computa��o - DSC
 * Curso: Ci�ncia da Computa��o
 * Disciplina: Desenvolvimento de Aplica��es Corporativas Avan�adas (2008.1)
 * Professor: Jacques Philippe Sauv�
 * Monitor: Guilherme Mauro Germoglio Barbosa
 * Alunos: Daniel Souza Coelho
 * 		   Everton Leandro Galdino Alves
 * 		   Odilon Francisco de Lima Junior	
 */

package lembrete.core.beans;

import java.util.ArrayList;
import java.util.List;

import lembrete.core.exceptions.ExcecaoBD;
import lembrete.core.exceptions.ExcecaoParametroInvalido;
import lembrete.core.exceptions.LembreteException;
/**
 * Essa classe representa um usuario do sistema Lembrete. <br>
 * O Usuario eh a principal entidade do Sistema. Ele possui um login (email), 
 * uma senha e um nome.  <br>
 * Cada usuario possui uma agenda, onde sao armazenados seu contatos, e uma 
 * caixa onde sao armazenadas suas mensagens recebidas.
 * 
 * @author Everton Leandro
 *         Odilon Francisco
 *         Daniel Coelho
 * @version 1.0 
 */
public class Usuario {

	private String name;
	
	private String email;
	
	private String password;
	
	private CaixaDeMensagem cxMensagem;
	
	private Agenda agenda;
	

	
	/**
	 * Construtor da classe Usuario.
	 * 
	 * @param email
	 * @param password
	 * @param name
	 * @throws LembreteException
	 */
	public Usuario(String email, String password, String name) throws LembreteException {
		setEmail(email);
		setPassword(password);
		this.name = name;
		this.agenda = new Agenda();
		this.cxMensagem = new CaixaDeMensagem();
	}
	
	public Usuario(){
		//
	}

	/**
	 * Retorna o email do usuario
	 * @return email do usuario
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * Altera o valor do email do usuario.
	 * 
	 * @param email
	 * @throws LembreteException - Caso o valor do novo email seja invalido.
	 */
	public void setEmail(String email) throws LembreteException {
		if (!valorEhValido(email)) {
			throw new LembreteException("Login invalido.");
		}
		this.email = email;
	}
	
	/**
	 * Metodo que avalia se um atributo passado eh um valor valido ou nao.
	 * 
	 * @param atributo
	 * @return true se o atributo for valido e false caso contrario
	 */
	private boolean valorEhValido(String atributo) {
		return !(atributo == null || atributo.equals(""));
	}

	/**
	 * Retorna a agenda do usuario.
	 * 
	 * @return agenda
	 */
	public Agenda getAgenda() {
		return agenda;
	}

	/**
	 * Troca o valor da agenda do usuario.
	 * 
	 * @param agenda nova
	 */
	public void setAgenda(Agenda agenda) {
		this.agenda = agenda;
	}

	/**
	 * Retorna a senha de um usuario.
	 * 
	 * @return password do usuario
	 */
	public String getPassword() {
		return password;
	}
	
	/**
	 * Atualiza a senha do usuario.
	 * 
	 * @param password
	 * @throws LembreteException - Caso a senha passada seja invalida.
	 */
	public void setPassword(String password) throws LembreteException {
		if (!valorEhValido(password)) {
			throw new LembreteException("Senha invalida.");
		}
		this.password = password;
	}

	/**
	 * Retorna o nome do usuario.
	 * 
	 * @return nome
	 */
	public String getNome() {
		return name;
	}

	/**
	 * Atualiza o nome do usuario.
	 * 
	 * @param nome
	 */
	public void setNome(String nome) {
		this.name = nome;
	}	
	
	/**
	 * Metodo que retorna o valor de um atributo pedido.
	 * 
	 * @param nomeAtrib
	 * @return valor do atributo pedido
	 */
	public String getAtributo(String nomeAtrib) {
		if (nomeAtrib.equals("nome"))
			return getNome();
		else if (nomeAtrib.equals("email"))
			return getEmail();
		return null;
	}

	/**
	 * Verifica se uma dada senha eh a senha do usuario.
	 * 
	 * @param senha
	 * @return true se a senha corresponder e false caso contrario
	 */
	public boolean verificaSenha(String senha){
		if(!getPassword().equals(senha))
			return false;
		return true;
	}

	/**
	 * Permite que o usuario insira uma entrada na sua agenda.
	 * 
	 * @param nome
	 * @param telefone
	 * @param aniversario
	 * @param idEnt
	 * @throws ExcecaoBD
	 */
	public void insereEntrada(String nome, String telefone, String aniversario, Long idEnt) throws ExcecaoBD {
		//Entrada e = new Entrada(nome, telefone, aniversario);
		Agenda agenda = getAgenda();
		agenda.insereEntrada(nome, telefone, aniversario);		
	}

	/**
	 *  Procura um determinado  atributo de um contato na agenda do usuario.
	 *  
	 * @param idContato
	 * @param nomeAtrib
	 * @return
	 * @throws ExcecaoParametroInvalido - Caso o parametro passado seja invalido.
	 */
	public String procuraContato(String idContato, String nomeAtrib) throws ExcecaoParametroInvalido {
		return getAgenda().procuraContato(idContato, nomeAtrib);
	}

	/**
	 * Retorna uma entrada como string
	 * 
	 * @param idEntrada
	 * @return
	 * @throws ExcecaoBD
	 */
	public String visualizarEntrada(String idEntrada) throws ExcecaoBD {
		return getAgenda().getEntradaPorId(idEntrada).toString();
	}

	/**
	 * Edita uma entrada da agenda, baseando-se no id dessa entrada.
	 *  
	 * 
	 * @param idEntrada
	 * @param campoAntigo
	 * @param novoCampo
	 * @throws ExcecaoParametroInvalido - Caso o paramentro passado seja invalido.
	 * @throws ExcecaoBD                - 
	 */
	public void editarEntrada(String idEntrada, String campoAntigo,
			String novoCampo) throws ExcecaoParametroInvalido, ExcecaoBD {
		getAgenda().editarEntrada(idEntrada, campoAntigo, novoCampo);
	}

	/**
	 * Passa o id do grupo para o usuario.
	 * 	 
	 *  @param idGrupo
	 */
	public void conectaAoGrupo(Long idGrupo) {
		getAgenda().conectaAoGrupo(idGrupo);
	}

	/**
	 * Retorna o valor de uma entrada, baseando-se em seu id.
	 * 
	 * @param entradaId
	 * @return Entrada
	 * @throws ExcecaoBD
	 */
	public Entrada getEntrada(String entradaId) throws ExcecaoBD {
		return getAgenda().getEntradaPorId(entradaId);
	}
	
	/**
	 * Exclui uma entrada da agenda, baseando-se em seu id.
	 * 
	 * @param idEntrada
	 */
	public void excluirEntrada(String idEntrada) {
		agenda.excluirEntrada(idEntrada);
	}

	/**
	 * Adiciona uma mensagem a caixa de mensagens do usuario.
	 * 
	 * @param msg recebida
	 * @param idGrupo 
	 */
	public void receberMensagem(String msg, String idGrupo){
		cxMensagem.adicionarMensagem(msg, idGrupo);
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	

	public void exluirEntrada(String idEntrada) {
		getAgenda().excluiEntrada(idEntrada);
		
	}

	public Long localizaEntrada(String string) throws ExcecaoParametroInvalido {
		return getAgenda().localizaEntrada(string);
	}
	
	public String toString(){
		return getNome()+" "+getEmail();
	}
	
	public CaixaDeMensagem getCxMensagem() {
		return cxMensagem;
	}

	public void setCxMensagem(CaixaDeMensagem cxMensagem) {
		this.cxMensagem = cxMensagem;
	}

	public Long getIdGrupoPorMsg(String descricao) {
		return getCxMensagem().localizaGrupoPorMsg(descricao);
		
	}

	public void removeMsg(String descricao) {
		getCxMensagem().removeMsg(descricao);
		
	}
		
}
